<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge" >
  <link rel="dns-prefetch" href="http://woshijingshenbing.com">
  <title>HTTP知识点总结 | Codreamer的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="工作四年来，用过.net和python，写过cs，也写过bs，但无论如何都得跟Http打交道。服务器端和客户端的通信， 从刚开始的代码堆砌，纯粹的CRUD，到慢慢熟悉相关原理，也越来越感受到编程的乐趣。今天看到一篇好文章， 铺得比较开，都是工作几年真正接触到的东西，以前自己有点似是而非的东西，也给讲清了，更重要的，点到而止， 再深就不合适了。">
<meta property="og:type" content="article">
<meta property="og:title" content="HTTP知识点总结">
<meta property="og:url" content="http://woshijingshenbing.com/2015/10/07/HTTP知识点总结/index.html">
<meta property="og:site_name" content="Codreamer的博客">
<meta property="og:description" content="工作四年来，用过.net和python，写过cs，也写过bs，但无论如何都得跟Http打交道。服务器端和客户端的通信， 从刚开始的代码堆砌，纯粹的CRUD，到慢慢熟悉相关原理，也越来越感受到编程的乐趣。今天看到一篇好文章， 铺得比较开，都是工作几年真正接触到的东西，以前自己有点似是而非的东西，也给讲清了，更重要的，点到而止， 再深就不合适了。">
<meta property="og:updated_time" content="2016-12-21T05:49:41.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="HTTP知识点总结">
<meta name="twitter:description" content="工作四年来，用过.net和python，写过cs，也写过bs，但无论如何都得跟Http打交道。服务器端和客户端的通信， 从刚开始的代码堆砌，纯粹的CRUD，到慢慢熟悉相关原理，也越来越感受到编程的乐趣。今天看到一篇好文章， 铺得比较开，都是工作几年真正接触到的东西，以前自己有点似是而非的东西，也给讲清了，更重要的，点到而止， 再深就不合适了。">
  
    <link rel="alternative" href="/atom.xml" title="Codreamer的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  <link rel="stylesheet" href="/main.css?v=4.0.0.css">
  

  
<script>
var _hmt = _hmt || [];
(function() {
	var hm = document.createElement("script");
	hm.src = "https://hm.baidu.com/hm.js?45db6f44750c33b1afd7970532c8b3fb";
	var s = document.getElementsByTagName("script")[0]; 
	s.parentNode.insertBefore(hm, s);
})();
</script>


</head>

<body>
  <div id="container" q-class="show:isCtnShow">
    <canvas id="anm-canvas" class="anm-canvas"></canvas>
    <div class="left-col" q-class="show:isShow">
      <div class="overlay"></div>
<div class="intrude-less">
	<header id="header" class="inner">
		<a href="/" class="profilepic">
			<img src="/img/avatar.png" class="js-avatar">
		</a>

		<hgroup>
		  <h1 class="header-author"><a href="/">Codreamer</a></h1>
		</hgroup>

		
		<p class="header-subtitle">除非你改变了交往的人和阅读的书，否则，你的五年之后和现在完全一样</p>
		

		<nav class="header-menu">
			<ul>
			
				<li><a href="/">主页</a></li>
	        
				<li><a href="/photos">相册</a></li>
	        
			</ul>
		</nav>
		<nav class="header-smart-menu">
	        
    		
    			
    			<a data-idx="0" q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
    			
    			
            
    			
    			<a data-idx="1" q-on="click: openSlider(e, 'friends')" href="javascript:void(0)">友链</a>
    			
    			
            
    			
    			<a data-idx="2" q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">关于我</a>
    			
    			
            
		</nav>
		<nav class="header-nav">
			<div class="social">
				
					<a class="github" target="_blank" href="https://github.com/sniperyen" title="github"><i class="icon-github"></i></a>
		        
					<a class="weibo" target="_blank" href="http://weibo.com/ddhj" title="weibo"><i class="icon-weibo"></i></a>
		        
					<a class="qq" target="_blank" href="/871757525" title="qq"><i class="icon-qq"></i></a>
		        
					<a class="mail" target="_blank" href="mailto:871757525@qq.com" title="mail"><i class="icon-mail"></i></a>
		        
			</div>
		</nav>
	</header>		
</div>

    </div>
    <div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
      <nav id="mobile-nav">
  	<div class="overlay">
  		<div class="slider-trigger"><i class="icon-sort"></i></div>
  		<h1 class="header-author js-mobile-header hide">Codreamer</h1>
  	</div>
	<div class="intrude-less">
		<header id="header" class="inner">
			<div class="profilepic">
				<img src="/img/avatar.png" class="js-avatar">
			</div>
			<hgroup>
			  <h1 class="header-author">Codreamer</h1>
			</hgroup>
			
			<p class="header-subtitle">除非你改变了交往的人和阅读的书，否则，你的五年之后和现在完全一样</p>
			
			<nav class="header-menu">
				<ul>
				
					<li><a href="/">主页</a></li>
		        
					<li><a href="/photos">相册</a></li>
		        
		        
		        	<li><a href="/archives/">所有文章</a></li>
		        
				</ul>
			</nav>
			<nav class="header-nav">
				<div class="social">
					
						<a class="github" target="_blank" href="https://github.com/sniperyen" title="github"><i class="icon-github"></i></a>
			        
						<a class="weibo" target="_blank" href="http://weibo.com/ddhj" title="weibo"><i class="icon-weibo"></i></a>
			        
						<a class="qq" target="_blank" href="/871757525" title="qq"><i class="icon-qq"></i></a>
			        
						<a class="mail" target="_blank" href="mailto:871757525@qq.com" title="mail"><i class="icon-mail"></i></a>
			        
				</div>
			</nav>
		</header>				
	</div>
</nav>

      <div id="wrapper" class="body-wrap">
        <div class="menu-l">
          <div class="canvas-wrap">
            <canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas>
          </div>
          <div id="js-content" class="content-ll">
            <article id="post-HTTP知识点总结" class="article article-type-post " itemscope itemprop="blogPost">
  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      HTTP知识点总结
    </h1>
  

        <a href="/2015/10/07/HTTP知识点总结/" class="archive-article-date">
  	<time datetime="2015-10-07T12:12:34.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2015-10-07</time>
</a>
      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>工作四年来，用过.net和python，写过cs，也写过bs，但无论如何都得跟Http打交道。服务器端和客户端的通信， 从刚开始的代码堆砌，纯粹的CRUD，到慢慢熟悉相关原理，也越来越感受到编程的乐趣。今天看到一篇好文章， 铺得比较开，都是工作几年真正接触到的东西，以前自己有点似是而非的东西，也给讲清了，更重要的，点到而止， 再深就不合适了。</p>
<a id="more"></a>
<h3 id="TCP-IP协议族"><a href="#TCP-IP协议族" class="headerlink" title="TCP/IP协议族"></a>TCP/IP协议族</h3><p>通常所说的网络（包括互联网），是在TCP/IP协议族的基础上运作的，而HTTP是它的一个子集。TCP/IP协议族可以分为4层，分别是应用层、传输层、网络层和链路层。下面分别介绍一下各层的作用：</p>
<ul>
<li>应用层：决定了向用户提供应用服务时通信的活动。FTP（File Transfer Protocol， 文件传输协议）、DNS（Domain Name System，域名系统）和HTTP都属于该层。</li>
<li>传输层：提供处于网络连接中的两台计算机之间的数据传输。TCP（Transmission Control Protocol，传输控制协议）和UDP（User Data Protocol，用户数据协议）都属于该层。</li>
<li>网络层：用来处理网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径（所谓的传输路线）到达对方计算机，并把数据包传给对方。与对方计算机之间通过多台计算机或网络设备进行传输时，网络层所起的作用就是在众多的选项内选择一条传输路线。</li>
<li>链路层：用来处理网络的硬件部分，包括操作系统、硬件的设备驱动、NIC（Network Interface Card，网卡）、光纤、诸如连接器之类的传输媒介等物理可见部分。</li>
</ul>
<h3 id="三次握手"><a href="#三次握手" class="headerlink" title="三次握手"></a>三次握手</h3><p>我们知道TCP和UDP主要的区别是UDP只负责发送，不确保一定送达；而TCP提供可靠的字节流服务（Byte Stream Service），采用三次握手策略确保数据送达。三次握手的过程使用了TCP 标志——SYN（synchronize）和ACK（acknowledgement）：</p>
<ul>
<li>发送端发送一个带SYN标志的数据包给对方。</li>
<li>接收端收到后，回传一个带有SYN/ACK标志的数据包以示传达确认信息。</li>
<li>发送端回传一个带ACK标志的数据包，表示握手结束。</li>
</ul>
<h3 id="HTTP通信"><a href="#HTTP通信" class="headerlink" title="HTTP通信"></a>HTTP通信</h3><p>利用TCP/IP协议族进行网络通信时，会通过分层顺序与对方进行通讯。以HTTP举例来说，过程是这样的：</p>
<ol>
<li>客户端在应用层（HTTP协议）发出一项想看某个Web页面的HTTP请求。</li>
<li>在传输层（TCP协议）把从应用层处收到的数据（HTTP请求报文）进行分割，并在各个报文上打上标记序号及端口号后转发给网络层。</li>
<li>在网络层（IP协议），增加作为通信目的地的MAC地址后转发给链路层。<br>经过以上步骤，一个网络请求就准备齐全了。经过网络传输之后，接收端的服务器在链路层接收到数据，按序往上层发送，一直到应用层。到了应用层才算真正接收到由客户端发送过来的HTTP请求。</li>
</ol>
<p>发送端在层与层之间传输数据时，每经过一层必定会被打上一个该层所属的首部信息；反之，接收端在层与层传输数据时，每经过一层时会把对应的首部消去。这种把数据信息包装起来的做法，也叫封装（encapsulate）。</p>
<h3 id="HTTP请求"><a href="#HTTP请求" class="headerlink" title="HTTP请求"></a>HTTP请求</h3><p>HTTP协议用于客户端与服务器端之间的通信，协议规定，请求从客户端发出，最后服务器端响应该请求并返回。来看一个请求报文的例子：</p>
<figure class="highlight http"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">GET</span> <span class="string">/search.jsp</span> HTTP/1.1</div><div class="line"><span class="attribute">Host</span>: g.hxgoogle.com</div></pre></td></tr></table></figure>
<p>起始行的GET是一个HTTP动词，也称为方法（method），它可以指定请求的资源按期望产生某种行为，<br>随后的字符串/search.jsp指明了请求访问的资源对象，称为请求URI（request-URI），HTTP/1.1即HTTP的版本号，<br>用来提示客户端使用的HTTP协议功能。所以这段报文的意思翻译一下是这样的：请求用GET方法访问<br>域名为g.hxgoogle.com的服务器上的/search.jsp页面资源。</p>
<p>一个完整的请求报文由Header和Body组成，Header包括请求方法、请求URI、协议版本、可选的请求首部字段等，<br>Body指报文主体。下面重点介绍一下请求URI和HTTP方法。</p>
<h3 id="URI和URL"><a href="#URI和URL" class="headerlink" title="URI和URL"></a>URI和URL</h3><p>URI表示统一资源标识符，是Uniform Resource Identifier的缩写。RFC2396(RFC，Request for Comments，<br>征求修正意见书，一些指定HTTP协议技术标准的文档)分别对这三个单词进行了如下定义：</p>
<ul>
<li>Uniform：规定统一的格式可方便处理多种不同类型的资源，而不用根据上下文环境来识别资源指定的访问方式。另外，加入新增的协议方案（如http:或ftp：）也更容易。</li>
<li>Resource：资源的定义是“可标识的任何东西”。资源不仅可以是单一的，也可以是个集合体。</li>
<li>Identifier：用来表示可标识的对象。也称为标识符。</li>
</ul>
<p>综上所述，URI就是由某个协议方案（如http、ftp）表示的资源的定位标识符。如下列举几种URI的例子：</p>
<figure class="highlight less"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="attribute">ftp</span>:<span class="comment">//ftp.is.co.za/rfc/rfc1808.txt</span></div><div class="line"><span class="attribute">http</span>:<span class="comment">//www.ietf.org/rfc/rfc2396.txt</span></div><div class="line"><span class="attribute">ldap</span>:<span class="comment">//[2001:db8::7]/c=GB?objectClass?one</span></div><div class="line"><span class="attribute">mailto</span>:John.Doe<span class="variable">@example</span>.com</div><div class="line"><span class="attribute">tel</span>:+<span class="number">1</span>-<span class="number">816</span>-<span class="number">555</span>-<span class="number">1212</span></div></pre></td></tr></table></figure>
<p>URI用字符串标识某一互联网资源，而我们相对来说更熟悉的URL（UniformResource Locator，统一资源定位符）<br>则是表示资源的地点。显然URL是URI的子集，而在我们大部分日常使用场景下，<br>说到URL和URI的时候其实表示的是一个意思。</p>
<h3 id="HTTP方法"><a href="#HTTP方法" class="headerlink" title="HTTP方法"></a>HTTP方法</h3><p>我们最常用的HTTP方法是GET和POST，这导致很多人以为HTTP方法只有GET和POST。这是不对的，<br>这些年RESTful API非常流行，所以作为Web开发人员至少还应该知道PUT和DELETE。当然HTTP方法并不只有这么几种，<br>下面介绍几种HTTP/1.1中的方法：</p>
<ul>
<li>GET：请求访问已被URI识别的资源，资源经服务器端解析后返回响应内容。</li>
<li>POST：POST在RESTful架构中一般用来创建资源。</li>
<li>PUT：对资源进行修改。</li>
<li>DELETE：删除资源。</li>
<li>HEAD：获得报文首部（Header），用于确认URI的有效性及资源的更新日期等。</li>
<li>TRACE：追踪路径。发送请求时，在请求Header中加上Max-Forwards字段，譬如Max-Forwards: 2这样，每经过一个服务器就将该数字减1，当数字为0时停止传输，最后接收到请求的服务器返回状态码200 OK响应，响应包含最初的请求内容（将HTTP请求原样返回）。</li>
<li>CONNECT：要求在于代理服务器通信时建立隧道，用隧道协议进行TCP通信。主要使用SSL（Secure Sockets Layer， 安全套接层）和TLS（Transport Layer Security，传输层安全）协议把通信内容加密后经网络隧道传输。格式为CONNECT 代理服务器名:端口号 HTTP版本号。</li>
</ul>
<h3 id="HTTP响应"><a href="#HTTP响应" class="headerlink" title="HTTP响应"></a>HTTP响应</h3><p>HTTP响应同样可分为Header和Body，它一般长这样：</p>
<figure class="highlight clean"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">HTTP/<span class="number">1.1</span> <span class="number">200</span> ok</div><div class="line">Date: ...</div><div class="line">Server: ..</div><div class="line">...</div><div class="line">空行(CR + LF)</div><div class="line">&lt;html&gt;</div><div class="line">...</div><div class="line">&lt;/html&gt;</div></pre></td></tr></table></figure>
<p>第一行是状态行，包含HTTP版本、表明响应结果的状态码和原因短语。接下来是一些首部字段，一般包括响应首部字段、通用首部字段、实体首部字段和RFC里未定义的首部（Cookie等），最后是报文主体。下面重点说明一下状态码和原因短语，它们描述了本次请求的结果。</p>
<h3 id="状态码"><a href="#状态码" class="headerlink" title="状态码"></a>状态码</h3><p>状态码的第一位数字指定了响应类别，共可分为5类：</p>
<ul>
<li>1XX：Informational（信息性状态码），表明接受的请求正在处理。</li>
<li>2XX：Success（成功状态码），表明请求正常处理完毕。</li>
<li>3XX：Redirection（重定向状态码），表明需进行附加操作以完成请求。</li>
<li>4XX：Client Error（客户端错误状态码），表明服务器无法处理请求。</li>
<li>5XX：Server Error（服务器错误状态码），表明服务器处理请求出错。</li>
</ul>
<p>下面列举几种常见的错误码和原因短语：</p>
<ul>
<li>200 OK：请求正常处理。</li>
<li>204 No Content：请求正常处理，但没有资源可返回。</li>
<li>206 Partial Content： 客户端进行了范围请求，服务器成功执行这部分GET请求。</li>
<li>301 Moved Permanently： 永久性重定向，表明该资源已被分配了新的URI。</li>
<li>302 Found： 临时性重定向，表明该资源暂时被分配了新的URI。</li>
<li>303 See Other：表明请求的资源存在另一个URI，明确要求客户端采用GET方法重定向请求资源。</li>
<li>304 客户端中所请求资源的缓存仍然是有效的,也就是说该资源从上次缓存到现在并没有被修改过.<br>条件请求可以在确保客户端的资源是最新的同时避免因每次都请求完整资源给服务器带来的性能问题.</li>
<li>400 Bad Request：请求报文中存在语法错误，需修改请求内容后再次发送。</li>
<li>401 Unauthorized*：请求需包含通过HTTP认证（BASIC认证、DIGEST认证等）的认证信息，浏览器初次接收401响应会弹出认证窗口。若之前已进行过一次请求，则表示用户认证失败。</li>
<li>403 Forbidden：请求资源的访问被服务器拒绝。服务器端没有必要给出拒绝的详细理由，不过也可以在响应主体部分对原因进行描述。未获得文件系统的访问授权（比如在IIS上部署网站时默认不能通过浏览器访问文件）、访问权限出现问题（比如从未授权的发送源IP地址试图访问）都有可能返回403响应。</li>
<li>404 Not Found：服务器无法找到请求的资源（也可在服务器端拒绝访问且不想说明理由时使用）。</li>
<li>500 Internal Server Error：服务器端执行请求时发生内部错误。多为服务器端程序出现Bug。</li>
<li>503 Service Unavailable：服务器处于超负载或正在停机维护，暂时无法处理请求。</li>
</ul>
<h3 id="HTTP协议的一些特性"><a href="#HTTP协议的一些特性" class="headerlink" title="HTTP协议的一些特性"></a>HTTP协议的一些特性</h3><p>HTTP协议的初始版本中，每进行一次HTTP通信就要断开一次TCP连接。这在当年都是一些小容量文本传输的情况下是可行的，但随着HTTP的普及，传输过程中包含大量图片的情况多了起来。譬如使用浏览器浏览一个包含多张图片的HTML页面时，在发送请求访问该HTML页面资源的同时，也会请求该页面包含的其他资源如各种不同的图片，它们是在不同服务器上的。如果每次请求都得重新建立一次TCP连接的话，无疑会增加通信量的开销，而且频繁断开又重连会导致页面加载缓慢，影响用户体验。</p>
<h3 id="持久连接（HTTP-Persistent-Connections）"><a href="#持久连接（HTTP-Persistent-Connections）" class="headerlink" title="持久连接（HTTP Persistent Connections）"></a>持久连接（HTTP Persistent Connections）</h3><p>为了解决上述问题，HTTP/1.1和一部分HTTP/1.0开始支持持久连接。持久连接的特点是，只要任意一端没有明确提出断开连接，则保持TCP连接状态。HTTP/1.1中所有的连接默认都是持久连接。</p>
<h3 id="管线化（pipelining）"><a href="#管线化（pipelining）" class="headerlink" title="管线化（pipelining）"></a>管线化（pipelining）</h3><p>持久连接使得多数请求以管线化方式发送成为可能。以往发送请求后需等待并收到响应后才能发送下一个请求，管线化技术出现后，无需等待亦可发送下一个请求。这就实现了多个请求的并行发送，提高了网络通信效率。</p>
<h3 id="Cookie"><a href="#Cookie" class="headerlink" title="Cookie"></a>Cookie</h3><p>HTTP是无状态协议，它不对之前发生过的请求和响应状态进行管理。无状态自然可以减少服务器的CPU及内存资源消耗，但有些时候我们又需要对过去的状态进行管理，譬如登录验证之后用户在浏览该网站其他网页时应该保持登录的状态而不是重新进行登录。当然要实现状态管理，我们可以使用很多方法，无外乎是在服务器端和客户端都保存一个凭证，之后每次请求都带上这个凭证，然后在服务器端进行比对，获取状态信息。HTTP协议中引入的Cookie技术，也是为了解决状态管理问题，采用的方法也跟我上面说的差不多，只不过这是发生在协议层面，不需要自己写很多代码管理。</p>
<p>具体来说，Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端状态，过程如下：</p>
<ol>
<li>客户端第一次发送请求，请求报文中没有Cookie信息。</li>
<li><p>服务器端生成Cookie信息，在响应报文中通过Set-Cookie这个首部字段，通知客户端保存Cookie，大概长这样：</p>
 <figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">HTTP/1.1 200 ok</div><div class="line">...</div><div class="line"><span class="tag">&lt;<span class="name">Set-Cookie:</span> <span class="attr">sid</span>=<span class="string">1345077140226724;path</span>=<span class="string">/;expires</span>=<span class="string">Fri,</span>=&gt;</span>23-Oct-15 07:12:20 GMT&gt;</div><div class="line">Content-Type: text/plain; charset=UTF-8</div></pre></td></tr></table></figure>
</li>
</ol>
<ol>
<li><p>客户端再次发送请求时，自动在请求报文中加入Cookie值后发送出去。大概长这样：</p>
 <figure class="highlight http"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">GET</span> <span class="string">/image/</span> HTTP/1.1</div><div class="line"><span class="attribute">Host</span>: github.com</div><div class="line"><span class="attribute">Cookie</span>: sid=1345077140226724</div></pre></td></tr></table></figure>
</li>
</ol>
<ol>
<li>服务器端收到Cookie信息后，会去检查从哪个客户端发来的连接请求，然后对比服务器上的记录，得到之前的状态信息。</li>
</ol>
<h3 id="参考连接"><a href="#参考连接" class="headerlink" title="参考连接"></a>参考连接</h3><ul>
<li><a href="http://www.jianshu.com/p/2ecd288d27ad" target="_blank" rel="external">HTTP知识点总结</a></li>
<li><a href="http://www.cnblogs.com/ziyunfei/archive/2012/11/16/2772729.html" target="_blank" rel="external">[译]理解HTTP/304响应</a></li>
</ul>

      

      
        <div class="page-reward">
          <a href="javascript:;" class="page-reward-btn tooltip-top">
            <div class="tooltip tooltip-east">
            <span class="tooltip-item">
              赏
            </span>
            <span class="tooltip-content">
              <span class="tooltip-text">
                <span class="tooltip-inner">
                  <p class="reward-p"><i class="icon icon-quo-left"></i>谢谢你请我吃糖果<i class="icon icon-quo-right"></i></p>
                  <div class="reward-box">
                    
                    <div class="reward-box-item">
                      <img class="reward-img" src="/img/pay-alipay.png">
                      <span class="reward-type">支付宝</span>
                    </div>
                    
                    
                    <div class="reward-box-item">
                      <img class="reward-img" src="/img/pay-wechat.png">
                      <span class="reward-type">微信</span>
                    </div>
                    
                  </div>
                </span>
              </span>
            </span>
          </div>
          </a>
        </div>
      
    </div>
    <div class="article-info article-info-index">
      
      
	<div class="article-tag tagcloud">
		<i class="icon-price-tags"></i>
		<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/http/">http</a></li></ul>
	</div>

      
	<div class="article-category tagcloud">
	<i class="icon-book icon"></i>
	<a class="article-category-link" href="/categories/技术/">技术</a>
	</div>


      

      
        
<div class="share-btn share-icons tooltip-left">
  <div class="tooltip tooltip-east">
    <span class="tooltip-item">
      <a href="javascript:;" class="share-sns share-outer">
        <i class="icon icon-share"></i>
      </a>
    </span>
    <span class="tooltip-content">
      <div class="share-wrap">
        <div class="share-icons">
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="icon icon-weibo"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="icon icon-weixin"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="icon icon-qq"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="icon icon-douban"></i>
          </a>
          <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a>
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="icon icon-facebook"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="icon icon-twitter"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="icon icon-google"></i>
          </a>
        </div>
      </div>
    </span>
  </div>
</div>

<div class="page-modal wx-share js-wx-box">
    <a class="close js-modal-close" href="javascript:;"><i class="icon icon-close"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="http://s.jiathis.com/qrcode.php?url=http://woshijingshenbing.com/2015/10/07/HTTP知识点总结/" alt="微信分享二维码">
    </div>
</div>

<div class="mask js-mask"></div>
      
      <div class="clearfix"></div>
    </div>
  </div>
</article>

  
<nav id="article-nav">
  
    <a href="/2015/11/07/编写高质量代码（改善python程序的91个建议）/" id="article-nav-newer" class="article-nav-link-wrap">
      <i class="icon-circle-left"></i>
      <div class="article-nav-title">
        
          编写高质量代码（改善python程序的91个建议）
        
      </div>
    </a>
  
  
    <a href="/2015/06/03/Markdown使用手册/" id="article-nav-older" class="article-nav-link-wrap">
      <div class="article-nav-title">Markdown使用手册</div>
      <i class="icon-circle-right"></i>
    </a>
  
</nav>






<div class="duoshuo">
	<!-- 多说评论框 start -->
	<div class="ds-thread" data-thread-key="HTTP知识点总结" data-title="HTTP知识点总结" data-url="http://woshijingshenbing.com/2015/10/07/HTTP知识点总结/"></div>
	<!-- 多说评论框 end -->
	<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
	<script type="text/javascript">
	var duoshuoQuery = {short_name:"woshijingshenbing"};
	(function() {
		var ds = document.createElement('script');
		ds.type = 'text/javascript';ds.async = true;
		ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
		ds.charset = 'UTF-8';
		(document.getElementsByTagName('head')[0] 
		 || document.getElementsByTagName('body')[0]).appendChild(ds);
	})();
	</script>
	<!-- 多说公共JS代码 end -->
</div>





          </div>
        </div>
      </div>
      <script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>

<footer id="footer">
  <div class="outer">
    <div id="footer-info">
    	<div class="footer-left">
    		&copy; 2016 Codreamer
    	</div>
      	<div class="footer-right">
      	<span id="busuanzi_container_site_uv">
          本站访客数<span id="busuanzi_value_site_uv"></span>人次
        </span>
      	</div>
    </div>
  </div>
</footer>

    </div>
    <script>
	var yiliaConfig = {
		mathjax: false,
		isHome: false,
		isPost: true,
		isArchive: false,
		isTag: false,
		isCategory: false,
		open_in_new: false,
		root: "/",
		innerArchive: true
	}
</script>

<script src="/./main.js?v=4.0.0.js"></script>


    
<div class="tools-col" q-class="show:isShow,hide:isShow|isFalse" q-on="click:stop(e)">
  <div class="tools-wrap">
    
    	<section class="tools-section tools-section-all" q-show="innerArchive">
        <div class="search-wrap">
          <input class="search-ipt" q-model="search" type="text" placeholder="find something…">
          <i class="icon-search icon" q-show="search|isEmptyStr"></i>
          <i class="icon-close icon" q-show="search|isNotEmptyStr" q-on="click:clearChose(e)"></i>
        </div>
        <div class="widget tagcloud search-tag">
          <p class="search-tag-wording">tag:</p>
          <label class="search-switch">
            <input type="checkbox" q-on="click:toggleTag(e)" q-attr="checked:showTags">
          </label>
          <ul class="article-tag-list" q-show="showTags">
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">Git</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">http</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">MongoDB</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">Markdown</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">Mysql</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">VIM</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">定时任务</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">mac</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">hexo</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">nodejs</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">pycharm</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">随记</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">游记</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">马尔代夫</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">买房</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">北京</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">python</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">并发</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">线程</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">进程</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">协程</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)">设计模式</a>
              </li>
            
            <div class="clearfix"></div>
          </ul>
        </div>
        <ul class="search-ul">
          <p q-show="jsonFail" style="padding: 20px; font-size: 12px;">
            缺失模块。<br/>1、在博客根目录（注意不是yilia根目录）执行以下命令：<br/> npm i hexo-generator-json-content --save<br/><br/>
            2、在根目录_config.yml里添加配置：
<pre style="font-size: 12px;" q-show="jsonFail">
  jsonContent:
    meta: false
    pages: false
    posts:
      title: true
      date: true
      path: true
      text: true
      raw: false
      content: false
      slug: false
      updated: false
      comments: false
      link: false
      permalink: false
      excerpt: false
      categories: false
      tags: true
</pre>
          </p>
          <li class="search-li" q-repeat="items" q-show="isShow">
            <a q-attr="href:path|urlformat" class="search-title"><i class="icon-quo-left icon"></i><span q-text="title"></span></a>
            <p class="search-time">
              <i class="icon-calendar icon"></i>
              <span q-text="date|dateformat"></span>
            </p>
            <p class="search-tag">
              <i class="icon-price-tags icon"></i>
              <span q-repeat="tags" q-on="click:choseTag(e, name)" q-text="name|tagformat"></span>
            </p>
          </li>
        </ul>
    	</section>
    

    
    	<section class="tools-section tools-section-friends" q-show="friends">
  		
        <ul class="search-ul">
          
            <li class="search-li">
              <a href="https://www.v2ex.com/" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>v2ex</a>
            </li>
          
            <li class="search-li">
              <a href="http://weavesilk.com/" target="_blank" class="search-title"><i class="icon-quo-left icon"></i>weavesilk</a>
            </li>
          
        </ul>
  		
    	</section>
    

    
    	<section class="tools-section tools-section-me" q-show="aboutme">
  	  	
  	  		<div class="aboutme-wrap" id="js-aboutme">他真诚地将自己的挑剔,&lt;br /&gt;误认为是对美的不懈追求，&lt;br /&gt;把自己的孤僻,&lt;br /&gt;误认为是不食人间烟火，&lt;br /&gt;把自己的散漫,&lt;br /&gt;误认为是对于自由的热爱。&lt;br /&gt;&lt;br /&gt;他的思想因为追求风雅而变得庸俗起来，&lt;br /&gt;他的行为因为小心翼翼而变得放纵不羁。&lt;br /&gt;&lt;br /&gt;他有很强的责任感，&lt;br /&gt;却也因此害怕做出承诺。&lt;br /&gt;&lt;br /&gt;他批判世上的所有东西，&lt;br /&gt;包括他自己。&lt;br /&gt;&lt;br /&gt;当别人指出他的自相矛盾后，&lt;br /&gt;他无法自圆其说，&lt;br /&gt;于是只好沉默。&lt;br /&gt;&lt;br /&gt;他是个不可理喻的人。</div>
  	  	
    	</section>
    
  </div>
  
</div>
    <!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                      <div class="pswp__preloader__cut">
                        <div class="pswp__preloader__donut"></div>
                      </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div> 
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>
  </div>
</body>
</html>